home *** CD-ROM | disk | FTP | other *** search
Text File | 1986-06-13 | 25.0 KB | 1,046 lines |
- %!
- % Macintosh LaserWriter header file.
- %
- % This is a file of PostScript definitions that can be affixed to the
- % front of the PostScript files generated by Macintosh applications in order
- % that they can be printed on a LaserWriter that has not been initialized
- % with the "LaserPrep" package. This situation will arise if you are
- % trying to share a LaserWriter between Macintosh users and non-Macintosh
- % users.
- %
- % Macintosh applications do not normally generate straight PostScript.
- % They generate a file in PostScript format, but the contents of the file
- % is a series of calls on functions that are not part of the PostScript
- % language. This file defines those functions.
- %
- % This is not the official Apple header file. It is neither endorsed nor
- % condemned by Apple. I suspect that it probably started out its life
- % as a bootleg copy of a version of the Apple header file. It has been
- % slightly modified by me and perhaps heavily modified by various other
- % people. I have substantially augmented the comments so that they explain
- % what I think the code is doing.
- %
- % Brian Reid Reid@SU-Glacier.ARPA
- % Stanford {decwrl,hplabs,bellcore}!glacier!reid
- %
- % WARNING: There is no guarantee that Apple will stick to this particular
- % set of definitions. This header file works with the application software
- % that came with my LaserWriter; I make no promises that it will work with
- % the software on anybody else's LaserWriter.
- %
- % To convert this file back into a downloaded file instead of a header
- % file, uncomment all of the lines beginning with %-%
-
- %-%0000000 % Server loop exit password
- %-%serverdict begin exitserver
- %-% systemdict /statusdict known
- %-% {statusdict begin 9 0 3 setsccinteractive /waittimeout 300 def end}
- %-% if
- /md 200 dict def % define a working dictionary
- md begin % start using it
- /av 13 def % define apple version
- /mtx matrix currentmatrix def % save current transformation
- /s30 30 string def
- /s1 ( ) def
- /pys 1 def
- /pxs 1 def
- /pyt 760 def
- /pxt 29.52 def
- /por true def
- /xl {translate} def
- /fp {pnsh 0 ne pnsv 0 ne and} def
-
- % Define QuickDraw operators as an array of procedures.
- % They are {frame, paint, erase, invert, fill}
- % For some reason "invert" is a no-op.
-
- /vrb [
- {fp
- {gsave 1 setlinewidth pnsh pnsv scale stroke grestore}
- if newpath}
- {eofill}
- {eofill}
- {newpath}
- {eofill}
- {initclip eoclip newpath}
- {}
- {}
- {}
- {}
- ] def
-
- % convenience function for backwards def
- /xdf {exch def} def
-
- % get current halftone screen parameters
- currentscreen
- /spf xdf % spot function
- /rot xdf % rotation
- /freq xdf % spatial frequency
-
- % "apply" function to execute appropriate numbered operator from /vrb.
- /doop {vrb exch get exec} def
-
- % compute page position from portrait/landscape flag, translation, scale,
- % and resolution.
- % call: P/L-flag xtransl ytransl scale*100 xbits/inch ybits/inch psu
- % typical call: F 580 760 100 72 72 psu for life-size screen-resolution
- % image.
- %
- /psu
- {2 index .72 mul exch div /pys xdf % pixel y scale
- div .72 mul /pxs xdf % pixel x scale
- /pyt xdf % pixel y translation
- /pxt xdf % pixel x translation
- /por xdf % portrait flag (T=portrait)
- } def
-
- % argument is page y size; use this to determine legal, letter, or note
- % and to set up appropriate scale factors and translation/reflection
- % for portrait or landscape.
-
- /txpose{
- dup 1680 eq
- % userdict /note known Commented out for TeX Applications
- % {{legal}{note}ifelse} Commented out for TeX Applications
- % {pop} Commented out for TeX Applications
- % ifelse Commented out for TeX Applications
- dup 1212 eq {54 32.4 xl} if
- 1321 eq {8.64 -.6 xl} if
- pxs pys scale pxt pyt xl por not
- {270 rotate} if
- 1 -1 scale
- } def
-
- % Compute oblique shear value for font if flag true
- /obl {{0.212557 mul}{pop 0} ifelse} def
-
- % set font from dictionary: make a font, set it to current, leave on stack
- % call: "found-font size oblique-flag dictionary sfd"
- /sfd {
- [ps 0 ps 6 -1 roll obl ps neg 0 0] makefont
- dup setfont
- } def
- /fnt {findfont sfd} def
-
- % bit test-- "number mask-word bt" returns boolean and unchanged number
- % thus, "4095 512 bt" returns "true 4095" -- the argument is a mask
- % and not a bit number.
-
- /bt {1 index and 0 ne exch} def
-
- % load style array with unpacked true/false flags from style word
- % flags are Bold, Italic, Underline, Outline, Shadow (I don't know
- % what the 6th one is supposed to be).
- /sa 6 array def
- /fs {
- 1 bt 2 bt 4 bt 8 bt 16 bt
- sa astore pop
- } def
-
- /matrix1 matrix def
- /matrix2 matrix def
- /gf{
- currentfont
- } def
-
- % set translation center from 2 double-precision integers giving x,y
- /tc{
- 32768 div add % compute y location
- 3 1 roll
- 32768 div add % compute x location
- 2t astore pop % save 'em
- } def
-
- /3a [0 0 0] def
- /2t 2 array def
-
- % store transformation params: "justify flip rotation tp"
- % (left/center/right/full, none/yflip,xflip, degrees)
- /tp{
- 3a astore pop
- } def
- /ee {} def
-
- % move PostScript current position to QuickDraw current position,
- % and get scaling and rotation right (this is in preparation for
- % outputting text
- /tt {
- gsave
- currentpoint 2 copy
- 2t aload pop qa 2 copy xl
- 3a aload pop exch dup 0 eq
- {pop}
- {1 eq {-1 1}
- {1 -1}ifelse scale}
- ifelse
- rotate
- pop neg exch neg exch xl
- moveto
- } def
-
- /te { % text-end: undo effects of prior "tt"
- currentpoint currentfont
- grestore setfont moveto % but leave font and currentpoint set
- } def
-
- /tb {
- /tg currentgray def
- 3 -1 roll 3 eq
- {1 setgray} if
- /ml 0 def /al 0 def
- } def
-
- /am {
- ml add /ml xdf
- } def
-
- /aa {
- [currentgray /setgray cvx] cvx
- exch dup wi pop dup al add /al xdf exch
- } def
-
- % scale by rational value (quotient) in x and y. Set "scaleflag" to
- % record that we have done this.
-
- /th {
- 3 -1 roll div
- 3 1 roll exch div
- % not sure of "transform" in next line (BKR)
- 2 copy matrix1 transform scale
- pop scale
- /scaleflag true def
- } def
-
- % undo a "th" scaling and return to default coordinate system
- /tu {
- 1 1 matrix1 itransform scale
- /scaleflag false def
- } def
-
- /ts {
- 1 1 matrix1 transform scale
- /scaleflag true def
- } def
-
- % record point size (of fonts)
- /fz{/ps xdf} def
-
- % execute a procedure but leave it on the stack
- /fx{dup exec} def
-
- /st{show pop pop} def
-
- % text munger. This does the dirty work for the edit string procedure
- % (following) by iterating over a polymorphic array and doing the right
- % thing with what it finds there.
- /tm {
- {dup type dup /integertype eq exch /realtype eq or
- {dup ml mul}
- {dup type /stringtype eq
- {rs}
- {dup type /dicttype eq
- {setfont}
- {dup type /arraytype eq
- {exec}
- {pop}
- ifelse
- } ifelse
- } ifelse
- } ifelse
- } forall
- } def
-
- % edit string. Takes a font, a text mode, a justification mode, and an
- % array of text and font changes for that text, and does it.
- /es {
- 3 -1 roll dup sa 5 get dup type /nulltype eq
- {pop4 pop}
- {sa 1 get
- {/ml ml .2 ps mul sub def} if
- ne {fs}
- {pop}
- ifelse exch
- dup 1 eq % justification mode 1 is left-justify
- {pop
- al ml gt
- {/tv {ll} /ml ml al dup 0 ne
- {div}{pop} ifelse
- def}
- {/tv {st} /ml 1 def}
- ifelse def tm
- }
- {dup 3 eq % justification mode 3 is right-justify
- {pop
- al ml gt
- {/tv {ll} /ml ml al dup 0 ne
- {div}{pop} ifelse
- def}
- {ml al sub 0 rmoveto
- /tv {st} /ml 1 def}
- ifelse def
- tm}
- {2 eq % justification mode 3 is centered
- {al ml gt
- { /tv {ll} /ml ml al dup
- 0 ne
- {div}{pop}
- ifelse def}
- {ml al sub 2 div 0 rmoveto
- /tv {st} /ml 1 def}
- ifelse def
- tm}
- { % otherwise it is just "justified"
- /tv {ll} def
- /ml ml al dup 0 ne
- {div}{pop}
- ifelse def
- tm}
- ifelse}
- ifelse}
- ifelse}
- ifelse
- tg setgray
- }def
-
- /pop4 {pop pop pop pop} def
- % --------------------------------------------------------------------
- % QuickDraw Procedures
- %
- % moveto. If a scale factor is in effect, then honor it.
- /gm {
- scaleflag {matrix1 itransform} if
- moveto
- } def
-
- %local y move
- % call: "x y localy ly"
- /ly {
- exch pop
- currentpoint exch pop
- sub 0 exch rmoveto
- } def
-
- % print n copies of page (ensures full speed for multiple copies)
- /page {
- 1 add /#copies xdf showpage
- } def
-
- /sk {
- systemdict /statusdict known
- } def
-
- % set job name
- /jn {
- sk {statusdict /jobname 3 -1 roll put}
- {pop}
- ifelse
- } def
-
- % set pen size: h v pen
- /pen {
- /pnsv xdf
- /pnsh xdf
- pnsh setlinewidth
- } def
-
- % draw line
- % (uses current pen location, pen size and graylevel)
- % This emulates the ugly QuickDraw pen on the LaserWriter but
- % preserves the same endpoint and linewidth anomalies that some applications
- % rely on. (Bletch).
- /dlin {
- currentpoint newpath moveto
- lineto currentpoint stroke
- grestore moveto
- } def
-
- /lin {
- currentpoint /pnlv xdf /pnlh xdf
- gsave newpath /@y xdf /@x xdf fp
- {pnlh @x lt
- {pnlv @y ge
- {pnlh pnlv moveto @x @y lineto
- pnsh 0 rlineto
- 0 pnsv rlineto
- pnlh pnsh add pnlv pnsv add lineto
- pnsh neg 0 rlineto}
- {pnlh pnlv moveto
- pnsh 0 rlineto
- @x pnsh add @y lineto
- 0 pnsv rlineto
- pnsh neg 0 rlineto
- pnlh pnlv pnsv add lineto}
- ifelse}
- {pnlv @y gt
- {@x @y moveto pnsh 0 rlineto
- pnlh pnsh add pnlv lineto
- 0 pnsv rlineto
- pnsh neg 0 rlineto
- @x @y pnsv add lineto}
- {pnlh pnlv moveto pnsh 0 rlineto
- 0 pnsv rlineto
- @x pnsh add @y pnsv add lineto
- pnsh neg 0 rlineto
- 0 pnsv neg rlineto}
- ifelse}
- ifelse
- closepath fill}
- if @x @y grestore moveto
- } def
-
- /dl {
- gsave
- 0 setlinewidth 0 setgray
- } def
-
- % Arc: top left bottom right startangle stopangle verb flag
- % flag true means to exclude the center of curvature in the arc
- /barc {
- /@f xdf /@op xdf /@e xdf /@s xdf
- /@r xdf /@b xdf /@l xdf /@t xdf
- gsave
- @r @l add 2 div @b @t add 2 div xl 0 0 moveto
- @r @l sub @b @t sub mtx currentmatrix pop scale
- @f {newpath} if
- 0 0 0.5 @s @e arc
- mtx setmatrix @op doop
- grestore
- } def
- /doarc {dup 0 eq barc} def
-
- % oval: top left bottom right verb
- /doval {0 exch 360 exch true barc} def
-
- % rectangle: top left bottom right verb
- /dorect {
- /@op xdf currentpoint 6 2 roll
- newpath 4 copy
- 4 2 roll exch moveto
- 6 -1 roll lineto
- lineto lineto closepath
- @op doop moveto
- } def
-
- /mup {dup pnsh 2 div le exch pnsv 2 div le or} def
-
- % roundrect: top left bottom right ovalwidth ovalheight operation
- % Warning: ovalwidth is assumed equal to ovalheight.
- /dorrect {
- /@op xdf 2. div /@h xdf 2. div /@w xdf
- /@r xdf /@b xdf /@l xdf /@t xdf
- @t @b eq @l @r eq @w mup or or
- {@t @l @b @r @op dorect}
- {@r @l sub 2. div dup @w lt
- {/@w xdf}{pop}
- ifelse
- @b @t sub 2. div dup @w lt
- {/@w xdf}{pop}
- ifelse
- @op 0 eq
- {/@w @w pnsh 2 div sub def}
- if %this helps solve overlap gap for wide line widths
- currentpoint
- newpath
- @r @l add 2. div @t moveto
- @r @t @r @b @w arcto pop4
- @r @b @l @b @w arcto pop4
- @l @b @l @t @w arcto pop4
- @l @t @r @t @w arcto pop4
- closepath @op doop
- moveto
- }ifelse
- } def
-
- % Polygon utility procedures
- /pr {
- gsave newpath /pl
- {moveto
- /pl {lineto} def
- }def
- } def
-
- /pl {lineto} def
-
- /ep {
- dup 0 eq
- {
- {moveto}{lin}{}{}
- pathforall %nothing but movetos and linetos should be called
- pop grestore
- }
- {
- doop grestore
- }
- ifelse
- } def
-
- /bs 8 string def
- /bd {/bs xdf} def
-
-
-
- % These following procedures are used in defining QuickDraw patterns.
- % (Pattern definition goes into halftone screen of PostScript)
-
- % procedure to find black bits in QuickDraw pattern (pattern in hex string bs)
- /bit {bs exch get exch 7 sub bitshift 1 and} def
- /bix {1 add 4 mul cvi} def
- /pp{exch bix exch bix bit}def
- /grlevel {64. div setgray} def
-
-
- % procedure to set a pattern: ratio hexstring
- % ratio is the total number of white bits in the QuickDraw pattern represented in hexstring
-
- /setpat {
- /bs xdf
- 9.375 0 {pp} setscreen
- grlevel
- } def
-
- /setgry {
- freq rot {spf} setscreen
- grlevel
- } def
-
- % standard copybits routine:
- % arguments: xscale yscale xloc yloc rowbytes xwidth ywidth fsmooth bitmode
- % This procedure is the basis for all QuickDraw bit operations.
- % xscale and yscale tell how much to scale the bit image in 72nds of an inch
- % xloc and yloc are the location of the top left corner of the bitmap
- % rowbytes is the total number of bytes in each scanline of hex data in the
- % image.
- % Note that rowbytes must be even.
- % xwidth and ywidth are the actual number of bits in the x and y coordinates
- % of the image. fsmooth is a flag to tell whether or not to use bit
- % smoothing. Bit smoothing is a
- % proprietary algorithm that provides smoothing of the data around a 5 by 5
- % local area of each data pixel.
- % bitmode can be any of the QuickDraw source transfer modes excluding srcXor
- % and notSrcXor.
- % Note that this is the only QuickDraw procedure that can implement
- % more than the simple srcCopy transfer mode.
-
- /x4 {2 bitshift} def
- /d4 {-2 bitshift} def
- /xf {.96 mul exch 2 sub .96 mul exch} def
- /dobits
- {
- /bmode xdf
- save 9 1 roll
- % 2 sub fixes dxsrc offset number required for bitsmoothing, but applies
- % to both
-
- %Bit Smooth mode
- {
- x4 /@dy xdf 2 sub x4 /@dx xdf /@idx xdf
- .96 mul exch 3 index 2 sub @dx div 7.68 mul dup 6 1 roll sub exch xl 0 0 moveto xf
- 0 4 -1 roll 2 index 4 index 1.759 add 10 dorect clip newpath 0 0 moveto scale
- bmode 0 eq bmode 4 eq or{1 setgray 1 @dy div 1 @dx div 1 1 2 dorect}if
- bmode 3 eq bmode 7 eq or{1}{0}ifelse setgray
- @idx 5 bitshift @dy bmode 0 eq bmode 1 eq bmode 3 eq or or [@dx 0 0 @dy 0 0]
- {(%stdin)(r) file @dy d4 4 add @idx mul string readhexstring pop
- dup length @idx x4 sub 4 bitshift string
- dup 3 1 roll @dx 8 add d4 smooth} imagemask
- }
- %Non Bit Smooth mode
- {
- /@dy xdf 2 sub /@dx xdf /@idx xdf
- /@xs @idx string def
- /@f (%stdin)(r) file def
- /@p{@f @xs readhexstring pop}def
- .96 mul xl 0 0 moveto xf scale
- 0 0 1 1 10 dorect clip newpath 0 0 moveto
- bmode 0 eq bmode 4 eq or{1 setgray .25 @dy div .25 @dx div 1 1 2 dorect}if
- bmode 3 eq bmode 7 eq or{1}{0}ifelse setgray
- @p @p
- @idx 3 bitshift @dy bmode 0 eq bmode 1 eq bmode 3 eq or or [@dx 0 0 @dy 0 0]
- {@p} imagemask
- @p @p pop4
- }ifelse
- restore
- } def
-
-
- % Making Mac compatible Fonts
-
-
- /mfont 14 dict def
- /wd 14 dict def
- /mdef {mfont wcheck not{/mfont 14 dict def}if mfont begin xdf end} def
- /dc {transform round .5 sub exch round .5 sub exch itransform} def
-
-
- % Copy a font dictionary: fontdictionary
- % copies a font dictionary into tmp so it may be used to define a new font
-
- % tmp must be set before cf is called
- /cf{{1 index /FID ne {tmp 3 1 roll put}{pop pop}ifelse}forall}def
-
-
- % Procedures used in defining a bit map font
-
- /mv{tmp /Encoding macvec put}def
- /bf{
- mfont begin
- /FontType 3 def
- /FontMatrix [1 0 0 1 0 0] def
- /FontBBox [0 0 1 1] def
- /Encoding macvec def
- /BuildChar
- {
- wd begin
- /cr xdf
- /fd xdf
- fd /low get cr get 2 get -1 ne
- {
- fd begin
- low cr get aload pop
- sd
- low cr 1 add get 0 get
- sh
- sw
- end
- /sw xdf
- /sh xdf
- sw div /clocn xdf
- dup 0 ne {0 exch sh div neg dc xl}{pop}ifelse
- exch sw div /coff xdf
- exch sw div /cloc xdf
- /bitw clocn cloc sub def
- sw sh div 1 scale
- sw div 0 coff 0 bitw coff add 1 setcachedevice
- coff cloc sub 0 dc xl
- cloc .5 sw div add 0 dc newpath moveto
- bitw 0 ne
- {0 1 rlineto bitw .5 sw div sub 0 rlineto 0 -1 rlineto
- closepath clip
- sw sh false [sw 0 0 sh neg 0 sh]{fd /hm get}imagemask}if
- } if
- end
- } def
- end
- mfont definefont pop
- } def
-
-
- % stringwidth procedure which does not allow a show to occur: (string)
-
- /wi{save exch /show{pop}def
- stringwidth 3 -1 roll restore}def
-
- /aps {0 get 124 eq}def
- /apn {s30 cvs aps} def
-
-
- %set style in a PostScript name: AppleFontName
- % e.g.
- % /|----name sos /|---Oname
- % /|----name sis /|-I--name
-
- /xc{s30 cvs dup}def
- /xp{put cvn}def
- /scs{xc 3 67 put dup 0 95 xp}def
- /sos{xc 3 79 xp}def
- /sbs{xc 1 66 xp}def
- /sis{xc 2 73 xp}def
- /sob{xc 2 79 xp}def
- /sss{xc 4 83 xp}def
-
- /dd{exch 1 index add 3 1 roll add exch} def
- /smc{moveto dup show} def
- /kwn{dup FontDirectory exch known{findfont exch pop}}def
- /fb{/ps ps 1 add def}def
- /mb
- {dup sbs kwn
- {
- exch{pop}{bbc}{} mm
- }ifelse
- sfd
- }def
- /mo
- {dup sos kwn
- {
- exch{pop}{boc}{} mm
- }ifelse
- sfd
- }def
- /ms
- {dup sss kwn
- {
- exch{pop}{bsc}{} mm
- }ifelse
- sfd
- }def
-
- /ao
- {dup sos kwn
- {
- exch dup ac pop
- {scs findfont /df2 xdf}{aoc}{} mm
- }ifelse
- sfd
- }def
-
- /as
- {dup sss kwn
- {
- exch dup ac pop
- {scs findfont /df2 xdf}{asc}{} mm
- }ifelse
- sfd
- }def
-
- /ac
- {
- dup scs kwn
- {exch /ofd exch findfont def
- /tmp ofd maxlength 1 add dict def
- ofd cf mv
- tmp /PaintType 1 put
- tmp definefont}ifelse
- }def
-
- /mm{
- /mfont 10 dict def
- mfont begin
- /FontMatrix [1 0 0 1 0 0] def
- /FontType 3 def
- /Encoding macvec def
- /df 4 index findfont def
- /FontBBox [0 0 1 1] def
- /xda xdf
- /mbc xdf
- /BuildChar { wd begin
- /cr xdf
- /fd xdf
- /cs s1 dup 0 cr put def
- fd /mbc get exec
- end
- } def
- exec
- end
- mfont definefont} def
- /bbc
- {
- /da .03 def
- fd /df get setfont
- gsave
- cs wi exch da add exchd
- grestore
- setcharwidth
- cs 0 0 smc
- da 0 smc
- da da smc
- 0 da moveto show
- } def
-
- /boc
- {
- /da 1 ps div def
- fd /df get setfont
- gsave
- cs wi
- exch da add exch
- grestore
- setcharwidth
- cs 0 0 smc
- da 0 smc
- da da smc
- 0 da smc
- 1 setgray
- da 2. div dup moveto show
- } def
-
- /bsc
- {
- /da 1 ps div def
- /ds .05 def %da dup .03 lt {pop .03}if def
- /da2 da 2. div def
- fd /df get setfont
- gsave
- cs wi
- exch ds add da2 add exch
- grestore
- setcharwidth
- cs ds da2 add .01 add 0 smc
- 0 ds da2 sub xl
- 0 0 smc
- da 0 smc
- da da smc
- 0 da smc
- 1 setgray
- da 2. div dup moveto show
- } def
- /aoc
- {
- fd /df get setfont
- gsave
- cs wi
- grestore
- setcharwidth
- 1 setgray
- cs 0 0 smc
- fd /df2 get setfont
- 0 setgray
- 0 0 moveto show
- }def
- /asc
- {
- /da .05 def
- fd /df get setfont
- gsave
- cs wi
- exch da add exch
- grestore
- setcharwidth
- cs da .01 add 0 smc
- 0 da xl
- 1 setgray
- 0 0 smc
- 0 setgray
- fd /df2 get setfont
- 0 0 moveto show
- }def
-
- /T true def
- /F false def
-
-
- % More Polygon stuff used in polygon comment
-
- /6a 6 array def
- /2a 2 array def
- /5a 5 array def
- %subtract points, first from second (reverse order): pt0 pt1 qs newpt
- /qs{3 -1 roll sub exch 3 -1 roll sub exch}def
- /qa{3 -1 roll add exch 3 -1 roll add exch}def
- %multiply point: pt factor qm newpt
- /qm{3 -1 roll 1 index mul 3 1 roll mul}def
- /qn{6a exch get mul}def
- /qA .166667 def /qB .833333 def /qC .5 def
- /qx{
- 6a astore pop
- qA 0 qn qB 2 qn add qA 1 qn qB 3 qn add
- qB 2 qn qA 4 qn add qB 3 qn qA 5 qn add
- qC 2 qn qC 4 qn add qC 3 qn qC 5 qn add
- }def
- /qp{6 copy 12 -2 roll pop pop}def
- /qc{qp qx curveto}def
- /qi{{4 copy 2a astore aload pop qa .5 qm newpath moveto}{2 copy 6 -2 roll 2 qm qs 4 2 roll}ifelse}def
- /qq{{qc 2a aload pop qx curveto}{4 copy qs qa qx curveto}ifelse}def
-
- %start polygon comment
- /pt{gsave currentpoint newpath moveto}def
-
- %fill smoothed poly
- /qf{gsave eofill grestore}def
- /tr{currentgray currentscreen bs 5a astore pop /fillflag 1 def}def
- /bc{/fillflag 0 def}def
-
- %polyverb ec
- /ec{currentpoint 3 -1 roll
- 1 and 0 ne
- {currentgray currentscreen bs 5a aload pop bd setscreen setgray 0 doop bd setscreen setgray}
- {newpath}ifelse
- moveto
- }def
-
- /bp {
- currentpoint newpath 2 copy moveto
- currentgray currentscreen bs 5a astore pop
- } def
-
- /eu{
- fillflag 0 ne
- {
- gsave currentgray currentscreen bs
- 5a aload pop bd setscreen setgray
- 4 ep
- bd setscreen setgray
- }if
- fp{0 ep}{grestore newpath}ifelse
- }def
-
-
- % Line Layout stuff used by string merging algorithm
-
- % counts spaces in string: (...) sm (...) n
- % returns string and number of spaces in string
-
- /sm
- {
- dup 0 exch
- {32 eq{1 add}if}forall
- }
- def
-
-
- % layout a string to length specified by desiredlength: printerlength desiredlength (...) ll
- % printerlength is length of string in printer space
-
- /ll
- {
- 3 1 roll exch dup .0001 lt 1 index -.0001 gt and
- {pop pop pop}
- {sub dup 0 eq
- {
- pop show
- }
- {
- 1 index sm dup 0 eq 3 index 0 le or
- {
- pop length div
- 0 3 -1 roll ashow
- }
- {
- % This piece does 10 percent stretching in characters and 90 percent in spaces
- 10 mul exch length add div
- dup 10 mul 0 32 4 -1 roll 0 6 -1 roll awidthshow
- % This piece does straight stretching in spaces only
- % exch pop div
- % 0 32 4 -1 roll widthshow
- }ifelse
- }ifelse
- }ifelse
- }def
-
-
- %set font to symbol and show the string: (...) ss
-
- /ss
- { /pft currentfont def sa aload pop pop /|----2Symbol 4 1 roll
- {pop{as}}
- {{{ao}}{{fnt}}ifelse}ifelse
- exch pop exec exch pop
- }def
- /pf{pft dup setfont}def
-
-
- % regular show does underline if ulf is true:
- % arguments: printerlength desiredlength string rs
-
- /rs
- {
- sa 2 get
- {
- gsave
- 1 index 0
- currentfont
- dup /FontInfo known
- {
- /FontInfo get
- dup /UnderlinePosition known
- {
- dup /UnderlinePosition get 1000 div ps mul
- }
- {
- ps 10 div neg %15 makes line closer to text
- }ifelse
- exch
- dup /UnderlineThickness known
- {
- /UnderlineThickness get 1000 div ps mul
- }
- {
- pop
- ps 15 div %20 makes slightly narrower line
- }ifelse
- }
- {
- pop
- ps 10 div neg %15 makes line closer to text
- ps 15 div %20 makes slightly narrower line
- }ifelse
- setlinewidth
- 0 setgray
- currentpoint 3 -1 roll sub moveto
- sa 4 get{gsave currentlinewidth 2. div dup rmoveto currentpoint xl 2 copy rlineto
- stroke grestore}if
- sa 3 get sa 4 get or 3 1 roll 2 index{gsave 1 setgray 2 copy rlineto stroke grestore}if
- rlineto{strokepath 0 setlinewidth}if stroke
- grestore
- }if
- tv
- }
- def
-
-
- % More Font building stuff, specifically the Apple Encoding Vector
-
- % Font encoding vector for PostScript fonts to match Mac
- /macvec 256 array def
- macvec 0
- /Times-Roman findfont /Encoding get
- 0 128 getinterval putinterval macvec 39 /quotesingle put
- /dotlessi /grave /circumflex /tilde /cedilla /registerserif
- /copyrightserif /trademarkserif
- macvec 0 8 getinterval astore pop
- /Adieresis /Aring /Ccedilla /Eacute /Ntilde /Odieresis /Udieresis /aacute
- /agrave /acircumflex /adieresis /atilde /aring /ccedilla /eacute /egrave
- /ecircumflex /edieresis /iacute /igrave /icircumflex /idieresis /ntilde
- /oacute /ograve /ocircumflex /odieresis /otilde /uacute /ugrave
- /ucircumflex /udieresis
- /dagger /ring /cent /sterling /section /bullet /paragraph /germandbls
- /registersans /copyrightsans /trademarksans /acute /dieresis /notequal
- /AE /Oslash
- /infinity /plusminus /lessequal /greaterequal /yen /mu /partialdiff
- /summation
- /product /pi /integral /ordfeminine /ordmasculine /Omega /ae /oslash
- /questiondown /exclamdown /logicalnot /radical /florin /approxequal /Delta
- /guillemotleft /guillemotright /ellipsis /space /Agrave /Atilde /Otilde
- /OE /oe /endash /emdash /quotedblleft /quotedblright /quoteleft
- /quoteright /divide /lozenge /ydieresis /Ydieresis /fraction /currency
- /guilsinglleft /guilsinglright /fi /fl /daggerdbl /periodcentered
- /quotesinglbase /quotedblbase /perthousand /Acircumflex /Ecircumflex /Aacute
- /Edieresis /Egrave /Iacute /Icircumflex /Idieresis /Igrave /Oacute
- /Ocircumflex /apple /Ograve /Uacute /Ucircumflex /Ugrave /dotlessi
- /asciicircum /asciitilde /macron /breve /dotaccent /ring /cedilla
- /hungarumlaut /ogonek /caron
- macvec 128 128 getinterval astore pop
-
- % now redefine all fonts using the MAC Encoding (except in Symbol) to make
- % them be Apple compatible.
-
- FontDirectory
- {exch dup s30 cvs /@s xdf @s aps
- {pop pop}
- {exch dup length dict /tmp xdf
- cf
- /Symbol ne {mv} if
- /@i false def /@o false def /@b false def
- mark @s (Italic) search {/@i true def} if (Oblique) search {/@o true def} if
- (Bold) search {/@b true def} if (Roman) search pop (-) search pop /@s xdf cleartomark
- @s cvn dup /Symbol eq{pop 50}{/Courier eq{51}{49}ifelse}ifelse
- s30 0 @s length 6 add getinterval dup 6 @s putinterval dup 0 (|-----) putinterval
- @b {dup 1 66 put} if @i @o or {dup 2 73 put} if % @o {dup 2 79 put} if
- dup 5 4 -1 roll put
- cvn tmp definefont pop
- }ifelse
- }forall
-
-
- %Make any other special fonts here, i.e. Seattle
-
- /_--C-2Symbol /Symbol findfont /tmp 1 index maxlength 1 add dict def cf tmp /PaintType 1 put tmp definefont
- /|----4Seattle /Helvetica findfont dup length 1 add dict /tmp xdf cf mv
- /mxv [/zero /one /two /three /four /five /six /seven /eight /nine /comma /period /dollar /numbersign
- /percent /plus /hyphen /E /parenleft /parenright /space] def
- tmp /Metrics 21 dict dup begin mxv{600 def}forall end put
- tmp begin /FontBBox FontBBox [0 0 0 0] astore def end
- tmp definefont pop
-
-
- % open document, open page and close page procedures
- % close document doesn't do anything currently
-
- % txpose takes the vertical page size as a parameter
- /od{txpose 10 fz 0 fs F /|----3Courier fnt pop}def
- /op{/scaleflag false def /pm save def}def
- /cp{pm restore}def
-
- end
- pop % Added for TeX work to clean up the stack
-
-